/*
 * pthreadを用いて簡単なジョブ（ちょっとだけスリープ）を数回行う時間をはかるプログラム
 * ！！　GCDを使って並列実行するよ　！！
 * 参考：http://ascii.jp/elem/000/000/455/455786/index-3.html#eid456441
 */

#include <stdio.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>

#include <dispatch/dispatch.h> #GCD用

int main(void){

	int i;

	//同期用のグループを作成
	dispatch_group_t group = dispatch_group_create();
	
	//並列実行のためのキューを用意
	//http://www.manpagez.com/man/3/dispatch_get_global_queue/
	dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
	
	struct timespec ts3 = {3,0};
	struct timespec ts1 = {1,0};
	struct timeval basetime,etime;

	printf("loop start\n");
	gettimeofday(&basetime,NULL);//時間をはかる

	for(i=0; i<10; i++){
		
		dispatch_group_async
		(group,queue, //以下を並列実行
		 ^{
			 pthread_t p = pthread_self();
			 struct timeval tp;
			 //ジョブ
			 nanosleep(&ts3,NULL);//スリープ
			 gettimeofday(&tp,NULL);

			 {//結果出力
				 int j=i;
				 pthread_t q = pthread_self();
				 struct timeval tq;
				 gettimeofday(&tq,NULL);
			
				 printf("hello count %d\n running thread %p time %ld \n printing thread %p time %ld \n"
						,j, p,(tp.tv_sec - basetime.tv_sec), q,(tq.tv_sec - basetime.tv_sec));
			 }
			 nanosleep(&ts1,NULL);//スリープ
		 }
		 );
	}
	printf("loop end\n");
	
	//すべて終わるまでまつ。
	dispatch_group_wait(group,DISPATCH_TIME_FOREVER);
	
	printf("all job is finish!!\n");

	return 0;
}